package com.designpattern.principle.demeter.improve;

import java.util.ArrayList;
import java.util.List;

/**
 * 违反迪米特法则
 * 
 * @author zhangyang
 *
 */
public class Demeter1 {

	public static void main(String[] args) {
		// 创建了一个 SchoolManager 对象
		SchoolManager schoolManager = new SchoolManager();
		// 输出学院员工信息和总部员工信息
		schoolManager.printAllEmployee(new CollegeManager());

	}

}

// 总部员工
class Employee {
	private String id;

	public void setId(String id) {
		this.id = id;
	}

	public String getId() {
		return id;
	}
}

// 学院员工
class CollegeEmployee {
	private String id;

	public void setId(String id) {
		this.id = id;
	}

	public String getId() {
		return id;
	}
}

// 管理学院员工管理类-返回学院的所有员工
class CollegeManager {
	public List<CollegeEmployee> getAllEmployee() {
		List<CollegeEmployee> list = new ArrayList<CollegeEmployee>();
		for (int i = 0; i < 10; i++) { // 这里我们增加了10个员工到 list
			CollegeEmployee emp = new CollegeEmployee();
			emp.setId("学院员工id= " + i);
			list.add(emp);
		}
		return list;
	}

	// 输入学院所有的员工信息
	public void printAllEmployee() {
		List<CollegeEmployee> employee = this.getAllEmployee();
		for (CollegeEmployee e : employee) {
			System.out.println(e.getId());
		}
	}

}

// 学校管理类-返回学校总部的员工
/**
 * 这里SchoolManager的直接朋友是Employee CollegeManager CollegeEmployee不是直接朋友，而是一个陌生的类
 * 这样违反了迪米特法则
 * 
 * @author zhangyang
 *
 */
class SchoolManager {
	public List<Employee> getAllEmployee() {
		List<Employee> list = new ArrayList<Employee>();
		for (int i = 0; i < 5; i++) { // 这里我们增加了5个员工到 list
			Employee emp = new Employee();
			emp.setId("学校总部员工id= " + i);
			list.add(emp);
		}
		return list;
	}

	// 该方法完成输出总部和学院员工信息(id)
	/**
	 * 这里由于CollegeEmployee违反迪米特法则，要改进那么就需要将输出员工信息的方法封装在CollegeManager内部
	 * 然后调用输出打印所有员工方法就能实现逻辑
	 * @param sub
	 */
	void printAllEmployee(CollegeManager sub) {
		// 打印所有员工信息
		System.out.println("------------学院员工------------");
		sub.printAllEmployee();
		// 获取到总部员工
		List<Employee> list2 = this.getAllEmployee();
		System.out.println("------------学校总部员工------------");
		for (Employee e : list2) {
			System.out.println(e.getId());
		}
	}
}
